package com.java1234.rocketmq;

import org.apache.rocketmq.client.producer.SendCallback;
import org.apache.rocketmq.client.producer.SendResult;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.Message;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

/**
 * 消息生产者service类
 *
 * @author java1234_小锋
 * @site www.java1234.com
 * @company 南通小锋网络科技有限公司
 * @create 2021-09-05 11:50
 */
@Component("producerService")
public class ProducerService {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    /**
     * 发送简单消息
     */
    public void sendMessage() {
        for (int i = 0; i < 10; i++) {
            rocketMQTemplate.convertAndSend("java1234-rocketmq", "rocketmq大爷，你好" + i);
        }
    }

    /*** 发送同步消息 */
    public void sendSyncMessage() {
        for (int i = 0; i < 10; i++) {
            SendResult sendResult = rocketMQTemplate.syncSend("java1234-rocketmq", "rocketmq同步消息！" + i);
            System.out.println(sendResult);
        }
    }

    /*** 发送异步消息 */
    // 相对发送同步消息，异步消息性能更高，可靠性略差。适合对响应时间要求高的业务场景
    public void sendAsyncMessage() {
        for (int i = 0; i < 10; i++) {
            rocketMQTemplate.asyncSend("java1234-rocketmq", "rocketmg异步消息！" + i, new SendCallback() {
                @Override
                public void onSuccess(SendResult sendResult) {
                    System.out.println("发送成功！");
                }

                @Override
                public void onException(Throwable throwable) {
                    System.out.println("发送失败！");
                }
            });
        }
    }

    // 发送单向消息是指producer向 broker 发送消息，执行 API 时直接返回，不等待broker 服务器的结果 。这种方式主要用在不特别关心发送结果的场景，举例：日志发送；

    /*** 发送单向消息 */
    public void sendOneWayMessage() {
        for (int i = 0; i < 10; i++) {
            rocketMQTemplate.sendOneWay("java1234-rocketmq", "rocketmg单向消息！" + i);
        }
    }

    /*** 发送带Tag消息，测试根据Tag过滤消息 */
    // 消息发送端只能设置一个tag，消息接收端可以设置多个tag。
    // 接收消息端通过 ‘||’ 设置多个tag，如下：tag1 || tag2 || tag3 || ...
    public void sendMessageWithTag() {
        // 构造消息1
        Message msg1 = MessageBuilder.withPayload("rocketmq过滤消息测试- TAG01").build();
        // 构造消息2
        Message msg2 = MessageBuilder.withPayload("rocketmq过滤消息测试- TAG02").build();
        // 构造消息3
        Message msg3 = MessageBuilder.withPayload("rocketmq过滤消息测试- TAG03").build();
        rocketMQTemplate.convertAndSend("java1234-filter-rocketmq" + ":" + "TAG1", msg1);
        rocketMQTemplate.convertAndSend("java1234-filter-rocketmq" + ":" + "TAG2", msg2);
        rocketMQTemplate.convertAndSend("java1234-filter-rocketmq" + ":" + "TAG3", msg3);
    }

}
